import { kebabCase } from '../common';
import config from '../../config';
/**
 * 判断一个css尺寸值是否是相对值（lineHeight的值不适用）
 * @param value => ue 要判断的尺寸字符串
 */
export function isCssRelativeSize(value) {
    const reg = /(em|%|vw|vh|calc|rem|rpx)/;
    return reg.test(String(value));
}
/**
 * 获取css尺寸的数值
 * @param value 要处理的css值
 */
export function getCssSizeValue(value) {
    if (typeof value === 'string') {
        return parseFloat(value.replace(/[^-0-9.]/g, ''));
    }
    return value;
}
/**
 * 根据 config - rem/rpx 转换单位，PX、Px不会被转换
 * @param size 尺寸
 * @returns 根据 config - rem/rpx 得出的带有单位的尺寸
 */
export function transformSize(size) {
    if (!size)
        return size;
    const sizeStr = String(size);
    if (isCssRelativeSize(sizeStr) ||
        sizeStr.includes('PX') ||
        sizeStr.includes('Px')) {
        return sizeStr;
    }
    const val = getCssSizeValue(sizeStr);
    if (!val) {
        return sizeStr;
    }
    // rem
    if (config.rem && val >= config.rem.minPixelValue) {
        const valStr = String(val / config.rem.rootValue);
        const [valInt, decimals] = valStr.split('.');
        if (decimals && decimals.length > config.rem.unitPrecision) {
            // 控制精度以及去除尾巴上的0
            const d = decimals
                .substring(0, config.rem.unitPrecision)
                .replace(/0*$/, '');
            return `${valInt}${!d ? '' : '.' + d}rem`;
        }
        return valStr + 'rem';
    }
    // rpx
    if (config.rpx) {
        return val * 2 + 'rpx';
    }
    return val + 'px';
}
/**
 * 根据 config - rem/rpx 转换样式中的单位
 * @param style 样式
 * @returns 根据 config - rem/rpx 转好单位的行内样式
 */
export function transformStyleSize(style) {
    if (!style)
        return '';
    let styleObj = {};
    // value中是否含有冒号（background-image）
    let hasColon = false;
    if (typeof style === 'string') {
        if (style.includes('://')) {
            hasColon = true;
            style = style.replace('://', '{{colon//}}');
        }
        const couples = style.split(';');
        couples.forEach((a) => {
            if (!a.trim())
                return;
            const [k, v] = a.split(':');
            styleObj[k.trim()] = v.trim();
        });
    }
    else if (typeof style === 'object') {
        styleObj = style;
    }
    else {
        return '';
    }
    let styleStr = '';
    for (let k in styleObj) {
        let v = styleObj[k];
        if (typeof v === 'string') {
            // margin、padding等可能是多值字符串
            if (v.includes('px'))
                v = v.replace(/[-0-9.]+px/g, (a) => transformSize(a));
            if (hasColon)
                v = v.replace('{{colon//}}', '://');
        }
        styleStr += `${kebabCase(k)}:${v};`;
    }
    return styleStr;
}
